package Offer.offer2022;

/**
 * 二进制中1的个数
 * 有问题的解法（其实只是效率低一点）
 * 每次右移一位，判断末尾是否为1（是否为奇数），直到为0
 * 如果是负数，会出现死循环,这里使用无符号右移即可
 *
 * 低效率解法
 * n 反复 & 1，10， 100...
 * 也是就看n的每一位是不是1，直到32位（整数32位，后面的位数可能都是0）
 *
 * 高效率解法
 * n & n - 1
 * 10100 & 10010 = 10000
 */
public class Test10 {
    public static void main(String[] args) {
        System.out.println(getNumberOfOne(-20));
        System.out.println(getNumberOfOne2(-20));
    }

    //有问题的解法,负数会出现死循环
    public static int getNumberOfOne(int n) {
        int count = 0;
        while (n != 0) {
            if ((n & 1) == 1) {
                count++;
            }
            n >>>= 1;
        }
        return count;
    }

    //高效率解法
    public static int getNumberOfOne2(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            n = n & (n - 1);
        }
        return count;
    }

}
